package com.processmanager.sdk.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.time.LocalDateTime;

/**
 * 进程日志条目
 * 
 * <p>表示进程执行过程中的单条日志记录，包含：</p>
 * <ul>
 *   <li>日志时间戳</li>
 *   <li>日志级别</li>
 *   <li>日志内容</li>
 *   <li>日志来源（标准输出/错误输出）</li>
 * </ul>
 * 
 * @author ProcessManager
 * @version 1.0.0
 * @since 2024-01-01
 */
public class ProcessLog {
    
    /**
     * 日志时间戳
     */
    @JsonProperty("timestamp")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private LocalDateTime timestamp;
    
    /**
     * 日志级别
     */
    @JsonProperty("level")
    private LogLevel level;
    
    /**
     * 日志内容
     */
    @JsonProperty("message")
    private String message;
    
    /**
     * 日志来源
     */
    @JsonProperty("source")
    private LogSource source;
    
    /**
     * 默认构造函数
     */
    public ProcessLog() {
        this.timestamp = LocalDateTime.now();
    }
    
    /**
     * 带参数的构造函数
     * 
     * @param level 日志级别
     * @param message 日志内容
     * @param source 日志来源
     */
    public ProcessLog(LogLevel level, String message, LogSource source) {
        this();
        this.level = level;
        this.message = message;
        this.source = source;
    }
    
    /**
     * 创建信息级别日志
     * 
     * @param message 日志内容
     * @param source 日志来源
     * @return 日志条目
     */
    public static ProcessLog info(String message, LogSource source) {
        return new ProcessLog(LogLevel.INFO, message, source);
    }
    
    /**
     * 创建错误级别日志
     * 
     * @param message 日志内容
     * @param source 日志来源
     * @return 日志条目
     */
    public static ProcessLog error(String message, LogSource source) {
        return new ProcessLog(LogLevel.ERROR, message, source);
    }
    
    /**
     * 创建警告级别日志
     * 
     * @param message 日志内容
     * @param source 日志来源
     * @return 日志条目
     */
    public static ProcessLog warn(String message, LogSource source) {
        return new ProcessLog(LogLevel.WARN, message, source);
    }
    
    // Getters and Setters
    
    public LocalDateTime getTimestamp() {
        return timestamp;
    }
    
    public void setTimestamp(LocalDateTime timestamp) {
        this.timestamp = timestamp;
    }
    
    public LogLevel getLevel() {
        return level;
    }
    
    public void setLevel(LogLevel level) {
        this.level = level;
    }
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public LogSource getSource() {
        return source;
    }
    
    public void setSource(LogSource source) {
        this.source = source;
    }
    
    @Override
    public String toString() {
        return "ProcessLog{" +
                "timestamp=" + timestamp +
                ", level=" + level +
                ", message='" + message + '\'' +
                ", source=" + source +
                '}';
    }
    
    /**
     * 日志级别枚举
     */
    public enum LogLevel {
        INFO("信息"),
        WARN("警告"),
        ERROR("错误");
        
        private final String description;
        
        LogLevel(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }
    
    /**
     * 日志来源枚举
     */
    public enum LogSource {
        STDOUT("标准输出"),
        STDERR("错误输出"),
        SYSTEM("系统");
        
        private final String description;
        
        LogSource(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }
} 